"""
AI增强分析服务

集成DeepSeek API提供更个性化和专业的心理分析
"""
import json
import requests
from typing import Dict, Optional
from django.conf import settings
from .models import BasicInfo


class AIAnalysisService:
    """AI分析服务类"""
    
    def __init__(self):
        self.api_key = getattr(settings, 'DEEPSEEK_API_KEY', '')
        self.api_url = getattr(settings, 'DEEPSEEK_API_URL', '')
        self.timeout = 60  # 增加超时时间到60秒
    
    async def enhance_analysis_report(self, 
                                     total_score: int,
                                     average_score: float,
                                     basic_info: BasicInfo,
                                     basic_report: str) -> str:
        """
        使用AI增强分析报告
        
        Args:
            total_score: SCL-90总分
            average_score: SCL-90平均分
            basic_info: 基本信息
            basic_report: 基础分析报告
            
        Returns:
            增强后的分析报告
        """
        if not self.api_key or not self.api_url:
            print("AI服务未配置，返回基础报告")
            return basic_report
        
        try:
            # 构建AI提示词
            prompt = self._build_analysis_prompt(total_score, average_score, basic_info, basic_report)
            
            # 调用AI API
            enhanced_report = await self._call_deepseek_api(prompt)
            
            if enhanced_report:
                return enhanced_report
            else:
                return basic_report
                
        except Exception as e:
            print(f"AI增强分析失败: {e}")
            return basic_report
    
    async def generate_personalized_recommendations(self, 
                                                   total_score: int,
                                                   basic_info: BasicInfo) -> str:
        """
        生成个性化建议
        
        Args:
            total_score: SCL-90总分
            basic_info: 基本信息
            
        Returns:
            个性化建议文本
        """
        if not self.api_key or not self.api_url:
            return "保持良好的心理健康习惯，必要时寻求专业帮助。"
        
        try:
            prompt = self._build_recommendation_prompt(total_score, basic_info)
            recommendations = await self._call_deepseek_api(prompt)
            
            if recommendations:
                return recommendations
            else:
                return "建议关注心理健康，必要时寻求专业指导。"
                
        except Exception as e:
            print(f"AI建议生成失败: {e}")
            return "建议关注心理健康，必要时寻求专业指导。"
    
    def _build_analysis_prompt(self, 
                              total_score: int,
                              average_score: float,
                              basic_info: BasicInfo,
                              basic_report: str) -> str:
        """构建分析报告的AI提示词"""
        
        # 根据总分确定风险等级
        if total_score <= 180:
            risk_level = "正常"
        elif total_score <= 270:
            risk_level = "轻度困扰"
        elif total_score <= 360:
            risk_level = "中度困扰"
        elif total_score <= 405:
            risk_level = "较重困扰"
        else:
            risk_level = "严重困扰"
        
        prompt = f"""
作为专业的心理健康分析师，请基于以下SCL-90心理评估数据，提供一份专业、准确、温和的心理健康分析报告。

**用户基本信息：**
- 年龄：{basic_info.age}
- 性别：{basic_info.gender}
- 职业：{basic_info.occupation}
- 睡眠状况：{basic_info.sleep_condition}

**SCL-90评估结果：**
- 总分：{total_score}分（范围：90-450分）
- 平均分：{average_score}分（范围：1.0-5.0分）
- 风险等级：{risk_level}

**基础分析报告：**
{basic_report}

**请按以下要求优化分析报告：**

1. **专业性**：使用准确的心理学术语，但保持通俗易懂
2. **个性化**：结合用户的年龄、职业、睡眠状况等个人特征
3. **积极导向**：既要客观分析问题，也要传递希望和积极信息
4. **实用性**：提供具体可行的改善建议
5. **安全性**：对于高风险情况，明确建议寻求专业帮助

**输出格式要求：**
- 使用Markdown格式
- 包含：总体评估、详细分析、重点关注、个性化建议
- 字数控制在800-1200字
- 语调温和、专业、支持性

请生成优化后的心理健康分析报告：
"""
        return prompt
    
    def _build_recommendation_prompt(self, 
                                   total_score: int,
                                   basic_info: BasicInfo) -> str:
        """构建建议的AI提示词"""
        
        # 根据总分确定建议重点
        if total_score <= 180:
            focus = "保持良好的心理状态"
        elif total_score <= 270:
            focus = "学习压力管理技巧"
        elif total_score <= 360:
            focus = "寻求专业心理咨询"
        elif total_score <= 405:
            focus = "立即寻求专业心理健康服务"
        else:
            focus = "紧急寻求专业心理健康服务"
        
        prompt = f"""
作为心理健康专家，请为以下用户提供具体、实用的心理健康改善建议。

**用户信息：**
- 年龄：{basic_info.age}
- 性别：{basic_info.gender}  
- 职业：{basic_info.occupation}
- 睡眠状况：{basic_info.sleep_condition}

**心理健康状况：**
- SCL-90总分：{total_score}分
- 建议重点：{focus}

**请提供以下类型的建议：**

1. **日常生活建议**（3-4条）
2. **心理调节技巧**（2-3条）
3. **寻求帮助的指导**（1-2条）

**要求：**
- 建议要具体可操作
- 考虑用户的职业和生活状况
- 语言温和、支持性
- 每条建议50字以内
- 总字数300字以内

请直接输出建议列表，使用 "- " 开头：
"""
        return prompt
    
    async def _call_deepseek_api(self, prompt: str, max_retries: int = 3) -> Optional[str]:
        """
        调用DeepSeek API，带重试机制
        
        Args:
            prompt: 提示词
            max_retries: 最大重试次数
            
        Returns:
            AI响应文本或None
        """
        last_error = None
        
        for attempt in range(max_retries):
            try:
                headers = {
                    'Authorization': f'Bearer {self.api_key}',
                    'Content-Type': 'application/json'
                }
                
                payload = {
                    'model': 'deepseek-chat',
                    'messages': [
                        {
                            'role': 'system',
                            'content': '你是一位专业的心理健康分析师，具有丰富的临床经验和深度的心理学知识。请用温和、专业、支持性的语调提供心理健康分析和建议。'
                        },
                        {
                            'role': 'user',
                            'content': prompt
                        }
                    ],
                    'temperature': 0.7,
                    'max_tokens': 2000,
                    'stream': False
                }
                
                # 根据重试次数调整超时时间
                timeout = self.timeout + (attempt * 20)  # 每次重试增加20秒
                print(f"尝试调用AI API，第{attempt + 1}次，超时时间: {timeout}秒")
                
                # 同步调用（在实际异步环境中可以改为异步）
                response = requests.post(
                    self.api_url,
                    headers=headers,
                    json=payload,
                    timeout=timeout
                )
                
                if response.status_code == 200:
                    result = response.json()
                    if 'choices' in result and len(result['choices']) > 0:
                        content = result['choices'][0]['message']['content'].strip()
                        print(f"AI API调用成功，返回内容长度: {len(content)}")
                        return content
                else:
                    print(f"DeepSeek API错误: {response.status_code} - {response.text}")
                    if response.status_code == 429:  # 频率限制
                        import time
                        wait_time = 2 ** attempt  # 指数退避
                        print(f"遇到频率限制，等待{wait_time}秒后重试")
                        time.sleep(wait_time)
                        continue
                    elif response.status_code >= 500:  # 服务器错误，可以重试
                        last_error = f"服务器错误: {response.status_code}"
                        continue
                    else:  # 客户端错误，不需要重试
                        return None
                        
            except requests.exceptions.Timeout:
                last_error = f"请求超时 (尝试 {attempt + 1}/{max_retries})"
                print(last_error)
                if attempt < max_retries - 1:
                    import time
                    wait_time = 2 ** attempt  # 指数退避: 1s, 2s, 4s
                    print(f"等待{wait_time}秒后重试...")
                    time.sleep(wait_time)
                continue
                
            except requests.exceptions.ConnectionError:
                last_error = f"连接错误 (尝试 {attempt + 1}/{max_retries})"
                print(last_error)
                if attempt < max_retries - 1:
                    import time
                    time.sleep(2 ** attempt)
                continue
                
            except requests.exceptions.RequestException as e:
                last_error = f"请求异常: {e}"
                print(last_error)
                if attempt < max_retries - 1:
                    import time
                    time.sleep(1)
                continue
                
            except Exception as e:
                last_error = f"未知错误: {e}"
                print(last_error)
                break  # 未知错误不重试
        
        print(f"AI API调用失败，已重试{max_retries}次，最后错误: {last_error}")
        return None
    
    def test_api_connection(self) -> bool:
        """
        测试API连接
        
        Returns:
            连接是否成功
        """
        if not self.api_key or not self.api_url:
            return False
        
        try:
            headers = {
                'Authorization': f'Bearer {self.api_key}',
                'Content-Type': 'application/json'
            }
            
            payload = {
                'model': 'deepseek-chat',
                'messages': [
                    {
                        'role': 'user',
                        'content': '测试连接'
                    }
                ],
                'max_tokens': 10
            }
            
            response = requests.post(
                self.api_url,
                headers=headers,
                json=payload,
                timeout=10
            )
            
            return response.status_code == 200
            
        except Exception as e:
            print(f"API连接测试失败: {e}")
            return False


# 全局AI服务实例
ai_service = AIAnalysisService() 